package py.com.erpone.session.dm;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;

import javax.annotation.PostConstruct;
import javax.ejb.LocalBean;
import javax.ejb.Stateful;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;
import javax.servlet.http.HttpServletRequest;

import org.primefaces.context.RequestContext;

import py.com.erpone.entity.dm.FormaPago;
import py.com.erpone.entity.dm.Producto;
import py.com.erpone.entity.dm.Proveedor;
import py.com.erpone.entity.dm.SolicitudPedido;
import py.com.erpone.entity.dm.SolicitudPedidoDetalle;
import py.com.erpone.entity.dm.Usuario;
import py.com.erpone.session.dm.list.ProductoList;
import py.com.erpone.session.dm.list.ProveedorList;
import py.com.erpone.util.LocaleSelector;
import py.com.erpone.view.datamodel.ProductoDataModel;
import py.com.erpone.view.datamodel.ProveedorDataModel;

@Stateful
@Named
@LocalBean
@ConversationScoped
public class SolicitudPedidoBean {

	@PersistenceContext(type = PersistenceContextType.EXTENDED)
	private EntityManager em;

	@Inject
	private Conversation conversation;
	
	@Inject
	private LocaleSelector localeSelector;

	@Inject
	ProveedorList proveedorList;

	@Inject
	ProductoList productoList;	

	private List<Producto> productos;

	private SolicitudPedido solicitudPedido;

	private ProveedorDataModel proveedorModel;
	private ProductoDataModel productoModel;


	public List<Producto> getProductos() {
		return productos;
	}

	public void setProductos(List<Producto> productos) {
		this.productos = productos;
	}

	public ProductoDataModel getProductoModel() {
		return productoModel;
	}

	public void setProductoModel(ProductoDataModel productoModel) {
		this.productoModel = productoModel;
	}

	public ProveedorDataModel getProveedorModel() {
		return proveedorModel;
	}

	public void setProveedorModel(ProveedorDataModel proveedorModel) {
		this.proveedorModel = proveedorModel;
	}

	public SolicitudPedido getSolicitudPedido() {
		return solicitudPedido;
	}

	public void setSolicitudPedido(SolicitudPedido solicitudPedido) {
		this.solicitudPedido = solicitudPedido;
	}

	public void iniciar() {
		if (conversation.isTransient())
			conversation.begin();
		solicitudPedido = new SolicitudPedido();
		solicitudPedido.setFormaPago(new FormaPago());
		solicitudPedido.setProveedores(new ArrayList<Proveedor>());
		productos = new ArrayList<Producto>();
		proveedorModel = new ProveedorDataModel(proveedorList.findAll());
		productoModel = new ProductoDataModel(productoList.findAll());
		solicitudPedido.setFecha(new Date());
		solicitudPedido.setSolicitudPedidosDetalle(new ArrayList<SolicitudPedidoDetalle>());	
		solicitudPedido.setSituacion(SolicitudPedido.SITUACION_GENERANDO);

		
	}
	public String obtainUserId(){
		FacesContext context = FacesContext.getCurrentInstance();
		HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
		return request.getUserPrincipal().toString();
	}

	public HashMap<String, String> getSituaciones() {
		if(solicitudPedido == null)return null;
		HashMap<String, String> retorno = new HashMap<String, String>();
		Map<String, String> map = solicitudPedido.getListSituacion();
		for (Map.Entry<String, String> entry : map.entrySet()){
			retorno.put(localeSelector.getMensaje("situacion."+entry.getKey()), entry.getValue());
		}
		return retorno;
	}
	public String getSituacionExtenso(String key, HashMap<String, String> listSituacion) {
		String retorno = key;
		Map<String, String> map = listSituacion;
		for (Map.Entry<String, String> entry : map.entrySet()){
			if(key.equals(entry.getKey()))
				retorno = localeSelector.getMensaje("situacion."+entry.getKey());
		}		
		return retorno;
	}
	public void crearDetalles() {
//		Collection<Producto> producto = new TreeSet<Producto>();
//		Collection<SolicitudPedidoDetalle> solped = new TreeSet<SolicitudPedidoDetalle> ();
//		producto = productos;
//		solped = solicitudPedido.getSolicitudPedidosDetalle();
//		producto.removeAll(solped);
//		System.out.println(producto);
		for (Producto o : productos) {
			SolicitudPedidoDetalle spd = new SolicitudPedidoDetalle();
			spd.setProducto(o);
			spd.setSolicitudPedido(solicitudPedido);
			solicitudPedido.getSolicitudPedidosDetalle().add(spd);
		}
		productos = new ArrayList<Producto> ();
       
	}
/*
	 Codigo de crearDetalles para agregar a las lista de detalles solo si no
	 estan agregados, no funciona
	 for(Producto o: productos){
		 for(SolicitudPedidoDetalle sp:solicitudPedido.getSolicitudPedidosDetalle()){
			 if(!o.equals(sp.getProducto())){
			 SolicitudPedidoDetalle spd = new SolicitudPedidoDetalle();
			 spd.setProducto(o);
			 spd.setSolicitudPedido(solicitudPedido);
			 solicitudPedido.getSolicitudPedidosDetalle().add(spd);
			 }
	 }
	 }
 */
	public void eliminarDetalle(SolicitudPedidoDetalle spd) {
		// 1ra LINEA INNECESARIA
		SolicitudPedidoDetalle spdetail = spd;
		solicitudPedido.getSolicitudPedidosDetalle().remove(spdetail);
		productos.remove(spd.getProducto());

	}

	public void iniciar2(SolicitudPedido solicitudPedido) {
		if (conversation.isTransient())
			conversation.begin();
		this.solicitudPedido = solicitudPedido;	
		 productos = new ArrayList<Producto>();
		 for(SolicitudPedidoDetalle sp: solicitudPedido.getSolicitudPedidosDetalle()){
			 productos.add(sp.getProducto());
		 }
		proveedorModel = new ProveedorDataModel(proveedorList.findAll());
		productoModel = new ProductoDataModel(productoList.findAll());
		if (solicitudPedido.getSituacion().equals("E") || solicitudPedido.getSituacion().equals("A")){
			 RequestContext rc = RequestContext.getCurrentInstance();
			 rc.execute("dlg.hide()"); 
		        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, localeSelector.getMensaje("solicitud_noModificacion"), solicitudPedido.getSituacion()));
		        if (!conversation.isTransient())
					conversation.end();
		}
		//Probe actualizar desde el backing bean la tabla proveedores, no funciona igual
		RequestContext.getCurrentInstance().update("tabView:proveedoresList");
	}
	public void iniciarDetail(SolicitudPedido solicitudPedido) {
		if (conversation.isTransient())
			conversation.begin();
		this.solicitudPedido = solicitudPedido;	
		 productos = new ArrayList<Producto>();
		 for(SolicitudPedidoDetalle sp: solicitudPedido.getSolicitudPedidosDetalle()){
			 productos.add(sp.getProducto());
		 }
		proveedorModel = new ProveedorDataModel(proveedorList.findAll());
		productoModel = new ProductoDataModel(productoList.findAll());
		//Probe actualizar desde el backing bean la tabla proveedores, no funciona igual	}
	}
	public boolean checkProductosEmpty(){
		boolean empty = false;
	    if (solicitudPedido.getSolicitudPedidosDetalle().isEmpty()){
	    	empty = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, localeSelector.getMensaje("producto_error"), null));
	    }
		return empty;
	}
	public boolean checkProveedoresEmpty(){
		boolean empty = false;
	    if (solicitudPedido.getProveedores().isEmpty()){
	    	empty = true;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, localeSelector.getMensaje("proveedor_errorPedido"), null));
	    }
		return empty;
	}
	public void guardar() {
		if(!checkProductosEmpty()){
			solicitudPedido.setUsuario(new Usuario(obtainUserId()));
			solicitudPedido.setSituacion(SolicitudPedido.SITUACION_ABIERTO);
			if (solicitudPedido.getId() == null){
				em.persist(solicitudPedido);
	            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, localeSelector.getMensaje("comun.exito.creado"), null));	           
			}else{
				em.merge(solicitudPedido);
	            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, localeSelector.getMensaje("comun.exito.actualizado"), null));	           

			}
			if (!conversation.isTransient())
				conversation.end();
			 RequestContext rc = RequestContext.getCurrentInstance();
			 rc.execute("dlg.hide()"); 
			 RequestContext.getCurrentInstance().update(":formPrincipal:tableId,:formPedidos");
		}

	}

	public void enviar() {
	   if(!checkProductosEmpty() && !checkProveedoresEmpty()){
		solicitudPedido.setUsuario(new Usuario(obtainUserId()));
		solicitudPedido.setSituacion(SolicitudPedido.SITUACION_ENVIADO);
		if (solicitudPedido.getId() == null){
			em.persist(solicitudPedido);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, localeSelector.getMensaje("comun.exito.creado"), null));	           
		}else{
			em.merge(solicitudPedido);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, localeSelector.getMensaje("comun.exito.actualizado"), null));	           

		}if (!conversation.isTransient())
			conversation.end();
		RequestContext rc = RequestContext.getCurrentInstance();
		 rc.execute("dlg.hide()"); 
		 RequestContext.getCurrentInstance().update(":formPrincipal:tableId,:formPedidos");
	  }
	}

	public void eliminar(SolicitudPedido solicitudPedido) {
		if (solicitudPedido.getSituacion().equals("A")) {
			 RequestContext rc = RequestContext.getCurrentInstance();
			 rc.execute("dlgsolped.hide()"); 
		        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, localeSelector.getMensaje("solicitud_noEliminacion"), solicitudPedido.getSituacion()));		
		}else{
			em.remove(em.merge(solicitudPedido));
		}
		if (!conversation.isTransient())
			conversation.end();

	}

	public void cancelar() {
		if (!conversation.isTransient())
			conversation.end();
	}

}
